<?php

/**
 * 基于TCP透传模式的DTL645-2007规约电表数据采集器（增强版）
 */
class DTL645Single
{
    /**
     * 解析0x33组合数据
     *
     * @param string $response 原始响应数据
     *
     * @return array 解析后的组合数据
     */
    private function parseCombinedData($response)
    {
        $dataStart = strpos($response, "68") + 26; // 跳过地址和控制码
        $dataEnd = strrpos($response, "16");
        $dataSection = substr($response, $dataStart, $dataEnd - $dataStart);

        // 解析结果数组
        $parsedData = [];

        // 数据格式: 数据标识(4字节) + 数据项1(8字节) + 数据项2(8字节) + ...
        $offset = 0;

        // 解析电压 (数据标识: 00010000)
        $voltageId = substr($dataSection, $offset, 8);
        if ($voltageId === "00010000") {
            $voltageValue = substr($dataSection, $offset + 8, 8);
            $parsedData['voltage'] = $this->parseValue($voltageValue, 10); // 单位: V
            $offset += 16;
        }

        // 解析电流 (数据标识: 00020000)
        $currentId = substr($dataSection, $offset, 8);
        if ($currentId === "00020000") {
            $currentValue = substr($dataSection, $offset + 8, 8);
            $parsedData['current'] = $this->parseValue($currentValue, 1000); // 单位: A
            $offset += 16;
        }

        // 解析有功功率 (数据标识: 00040000)
        $powerId = substr($dataSection, $offset, 8);
        if ($powerId === "00040000") {
            $powerValue = substr($dataSection, $offset + 8, 8);
            $parsedData['active_power'] = $this->parseValue($powerValue, 10); // 单位: W
            $offset += 16;
        }

        // 解析功率因数 (数据标识: 00080000)
        $pfId = substr($dataSection, $offset, 8);
        if ($pfId === "00080000") {
            $pfValue = substr($dataSection, $offset + 8, 8);
            $parsedData['power_factor'] = $this->parseValue($pfValue, 1000); // 单位: 无
            $offset += 16;
        }

        // 解析总用电量 (数据标识: 00000002)
        $energyId = substr($dataSection, $offset, 8);
        if ($energyId === "00000002") {
            $energyValue = substr($dataSection, $offset + 8, 8);
            $parsedData['total_energy'] = $this->parseValue($energyValue, 100); // 单位: kWh
        }

        return $parsedData;
    }

    /**
     * 解析数值（处理字节序并应用缩放因子）
     *
     * @param string $hexValue 十六进制值
     * @param float $scale 缩放因子
     *
     * @return float 解析后的数值
     */
    private function parseValue($hexValue, $scale)
    {
        // 高低字节交换
        $swappedValue = substr($hexValue, 6, 2) .
            substr($hexValue, 4, 2) .
            substr($hexValue, 2, 2) .
            substr($hexValue, 0, 2);

        // 转换为浮点数并应用缩放因子
        return hexdec($swappedValue) / $scale;
    }

}


//$result = [];
//
//        echo "电表数据采集结果:\n";
//        echo "电压: {$result['voltage']} V\n";
//        echo "电流: {$result['current']} A\n";
//        echo "有功功率: {$result['active_power']} W\n";
//        echo "功率因数: {$result['power_factor']}\n";
//        echo "总用电量: {$result['total_energy']} kWh\n";

